package com.elitedatai.mchtest.wayline.service;


import com.dji.sdk.cloudapi.wayline.FlighttaskProgress;
import com.elitedatai.mchtest.component.mqtt.model.EventsReceiver;
import com.elitedatai.mchtest.wayline.model.dto.ConditionalWaylineJobKey;
import com.elitedatai.mchtest.wayline.model.dto.WaylineJobDTO;

import java.util.Optional;


public interface IWaylineRedisService {

    /**
     * 保存机场执行的航线任务状态到Redis
     * 将机场设备正在执行的航线任务进度信息存储到Redis缓存中，用于状态跟踪和监控
     * @param dockSn 机场设备序列号，用于标识具体的机场设备
     * @param data 包含飞行任务进度信息的事件接收器对象
     */
    void setRunningWaylineJob(String dockSn, EventsReceiver<FlighttaskProgress> data);

    /**
     * 查询机场执行的航线任务状态
     * 从Redis中获取指定机场设备正在执行的航线任务进度信息
     * @param dockSn 机场设备序列号，用于标识具体的机场设备
     * @return 包含飞行任务进度信息的Optional对象，如果不存在则返回空Optional
     */
    Optional<EventsReceiver<FlighttaskProgress>> getRunningWaylineJob(String dockSn);

    /**
     * 删除机场执行的航线任务状态
     * 从Redis中删除指定机场设备的航线任务状态信息，通常在任务完成或取消时调用
     * @param dockSn 机场设备序列号，用于标识具体的机场设备
     * @return 删除操作的结果，true表示删除成功，false表示删除失败或数据不存在
     */
    Boolean delRunningWaylineJob(String dockSn);

    /**
     * 保存机场暂停的航线任务到Redis
     * 将机场设备暂停执行的航线任务ID存储到Redis中，用于后续恢复操作
     * @param dockSn 机场设备序列号，用于标识具体的机场设备
     * @param jobId 被暂停的航线任务ID
     */
    void setPausedWaylineJob(String dockSn, String jobId);

    /**
     * 查询机场暂停的航线任务ID
     * 从Redis中获取指定机场设备暂停的航线任务ID
     * @param dockSn 机场设备序列号，用于标识具体的机场设备
     * @return 暂停的航线任务ID，如果不存在则返回null
     */
    String getPausedWaylineJobId(String dockSn);

    /**
     * 删除机场暂停的航线任务
     * 从Redis中删除指定机场设备的暂停任务记录，通常在任务恢复或取消时调用
     * @param dockSn 机场设备序列号，用于标识具体的机场设备
     * @return 删除操作的结果，true表示删除成功，false表示删除失败或数据不存在
     */
    Boolean delPausedWaylineJob(String dockSn);

    /**
     * 保存机场阻塞的航线任务到Redis
     * 将机场设备因条件不满足而被阻塞的航线任务ID存储到Redis中
     * @param dockSn 机场设备序列号，用于标识具体的机场设备
     * @param jobId 被阻塞的航线任务ID
     */
    void setBlockedWaylineJob(String dockSn, String jobId);

    /**
     * 查询机场阻塞的航线任务ID
     * 从Redis中获取指定机场设备被阻塞的航线任务ID
     * @param dockSn 机场设备序列号，用于标识具体的机场设备
     * @return 被阻塞的航线任务ID，如果不存在则返回null
     */
    String getBlockedWaylineJobId(String dockSn);

    /**
     * 保存条件航线任务到Redis
     * 将需要满足特定条件才能执行的航线任务信息存储到Redis中
     * @param waylineJob 条件航线任务对象，包含任务的详细信息和执行条件
     */
    void setConditionalWaylineJob(WaylineJobDTO waylineJob);

    /**
     * 查询条件航线任务
     * 从Redis中获取指定ID的条件航线任务信息
     * @param jobId 条件航线任务ID
     * @return 包含条件航线任务信息的Optional对象，如果不存在则返回空Optional
     */
    Optional<WaylineJobDTO> getConditionalWaylineJob(String jobId);

    /**
     * 删除条件航线任务
     * 从Redis中删除指定ID的条件航线任务信息
     * @param jobId 条件航线任务ID
     * @return 删除操作的结果，true表示删除成功，false表示删除失败或数据不存在
     */
    Boolean delConditionalWaylineJob(String jobId);

    /**
     * 添加条件航线任务到准备队列
     * 将条件航线任务添加到Redis的有序集合中，按时间排序等待条件检查
     * @param waylineJob 条件航线任务对象
     * @return 添加操作的结果，true表示添加成功，false表示添加失败
     */
    Boolean addPrepareConditionalWaylineJob(WaylineJobDTO waylineJob);

    /**
     * 获取最近的条件航线任务
     * 从Redis有序集合中获取最早需要检查条件的航线任务
     * @return 包含条件航线任务键的Optional对象，如果队列为空则返回空Optional
     */
    Optional<ConditionalWaylineJobKey> getNearestConditionalWaylineJob();

    /**
     * 获取条件航线任务的时间
     * 从Redis有序集合中获取指定条件航线任务的时间戳
     * @param jobKey 条件航线任务键，包含工作空间ID、机场序列号和任务ID
     * @return 任务的时间戳，如果不存在则返回null
     */
    Double getConditionalWaylineJobTime(ConditionalWaylineJobKey jobKey);

    /**
     * 从准备队列中移除条件航线任务
     * 从Redis有序集合中移除指定的条件航线任务
     * @param jobKey 条件航线任务键，包含工作空间ID、机场序列号和任务ID
     * @return 移除操作的结果，true表示移除成功，false表示移除失败或任务不存在
     */
    Boolean removePrepareConditionalWaylineJob(ConditionalWaylineJobKey jobKey);
}
